package com.vcc.core.util;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource;

import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class JsonUtil {
    /**
     * 把json文件转成对象
     *
     * @param path json文件路径
     * @param type 转换的类格式
     */
    public static <T> T jsonFileToObject(String path, Class<T> type) {
        try {
            return JSONObject.parseObject(
                    IOUtils.toString(
                            new InputStreamReader(
                                    new ClassPathResource(path).getInputStream(),
                                    StandardCharsets.UTF_8
                            )
                    ),
                    type
            );
        } catch (Exception e) {
            return null;
        }
    }

    public static <T> T jsonFileToObject(String path, TypeReference<T> type) {
        try {
            return JSONObject.parseObject(
                    IOUtils.toString(
                            new InputStreamReader(
                                    new ClassPathResource(path).getInputStream(),
                                    StandardCharsets.UTF_8
                            )
                    ),
                    type
            );
        } catch (Exception e) {
            return null;
        }
    }


    /**
     * 把json文件转成List
     *
     * @param path json文件路径
     * @param type 转换的类格式
     */
    public static <T> List<T> jsonFileToArray(String path, Class<T> type) {
        try {
            return JSONArray.parseArray(
                    IOUtils.toString(
                            new InputStreamReader(
                                    new ClassPathResource(path).getInputStream(),
                                    StandardCharsets.UTF_8
                            )
                    ),
                    type
            );
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 把json数据转成对象
     *
     * @param json json类型的数据
     * @param type 转换的类格式
     */
    public static <T> T jsonStringToObject(Object json, TypeReference<T> type) {
        try {
            if (json instanceof String) {
                return JSONObject.parseObject((String) json, type);
            } else {
                return JSONObject.parseObject(toJson(json), type);
            }
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 把json数据转成对象
     *
     * @param json json类型的数据
     * @param type 转换的类格式
     */
    public static <T> T jsonStringToObject(Object json, Class<T> type) {
        try {
            if (json instanceof String) {
                return JSONUtil.toBean((String) json, type);
            } else {
                return JSONUtil.toBean(toJson(json), type);
            }
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 把json数据转成List
     *
     * @param json json类型的数据
     * @param type 转换的类格式
     */
    public static <T> List<T> jsonStringToArray(Object json, Class<T> type) {
         try {
            if (json instanceof String){
               return JSONUtil.toList((String) json, type);
            } else{
               return JSONUtil.toList(toJson(json), type);
            }
        } catch (Exception e){
            return null;
        }
    }

    public static String toJson(Object json) {
        if (json == null) {
            return "";
        }
        return JSON.toJSONString(json);
    }

}
